﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
//class A
//{
//	void print()
//	{}
////private:
////	int _a;
////	int _b;
//};
//class B :public A
//{
//	void print()
//	{
//		//cout << _a << endl;
//	}
////private:
////	int _c;
//};
//int main()
//{
//	A a;
//	B b;
//	cout << sizeof(a) << endl;
//	cout << sizeof(b) << endl;
//	return 0;
//}
//class A
//{
//public:
//	A(int a=10)
//		:_a(a)
//	{}
//	void f() { cout << "A::f()" << endl; }
//private:
//	int _a;
//
//};
//
//
//class B : public A
//
//{
//
//public:
//	B(int b = 20)
//		:_b(b)
//	{}
//	void f(int a) { cout << "B::f()" << endl; }
//
//	int _b;
//
//};
//
//
//
//int main()
//
//{
//
//	B b;
//
//	b.f(10);
//
//	return 0;
//
//}
//class A
//
//{
//
//public:
//
//    virtual void f()
//
//    {
//
//        cout << "A::f()" << endl;
//
//    }
//
//};
//
//
//
//class B : public A
//
//{
//
//private:
//
//    virtual void f()
//
//    {
//
//        cout << "B::f()" << endl;
//
//    }
//
//};
//
//
//int main()
//{
//    A* pa = (A*)new B;
//
//    pa->f();
//
//    return 0;
//}

//class person
//{
//public:
//	virtual void Buyticket()
//	{
//		cout << "成人票:全价" << endl;
//	}
//};
//class child :public person
//{
//public:
//	virtual void Buyticket()
//	{
//		cout << "儿童票:半价" << endl;
//	}
//};
//
//void func(person& p)
//{
//	p.Buyticket();
//}
//int main()
//{
//	person p;
//	func(p);
//
//	child c;
//	func(c);
//}

//class A
//{
//public:
//	virtual ~A()
//	{
//		cout << "~A()" << endl;
//	}
//	virtual void print()
//	{
//		cout << "A" << endl;
//	}
//};
//class B :public A
//{
//public:
//	~B()
//	{
//		cout << "~B()" << endl;
//	}
//	void print()
//	{
//		cout << "B" << endl;
//	}
//};
//class Car
//{
//public:
//	virtual void Drive()final  {}
//};
//class Benz :public Car
//{
//public:
//	virtual void Drive() { cout << "Benz-舒适" << endl; }
//};
//class Car {
//public:
//	 virtual void Drive() {}
//};
//class Benz :public Car {
//public:
//	virtual void Drive() override { cout << "Benz-舒适" << endl; }
//};
//
//int main()
//{
//	/*A* a=new B;
//	a->print();*/
//	/*delete a;
//
//	a = new B;
//	a->print();*/
//	//delete a;
//	return 0;
//}
//class Car
//{
//public:
//	virtual void Drive() = 0;
//};
//class Benz :public Car
//{
//public:
//	virtual void Drive()
//	{
//		cout << "Benz-舒适" << endl;
//	}
//};
//class BMW :public Car
//{
//public:
//	virtual void Drive()
//	{
//		cout << "BMW-操控" << endl;
//	}
//};
//void Test()
//{
//	Car* pBenz = new Benz;
//	pBenz->Drive();
//	Car* pBMW = new BMW;
//	pBMW->Drive();
//}
//int main()
//{
//	Test();
//	return 0;
//}
//
//class Base1
//{
//public:
//	virtual void func()
//	{
//		int i = 0;
//	}
//};
//class Base2 :public Base1
//{
//public:
//	int _a;
//};
//void func1()
//{
//	int i = 0;
//}
//int main()
//{
//	Base1 e;
//	int a = 0;
//	static int b = 0;
//	int* c = new int;
//	const char* d = "abcdefg";
//	printf("栈区:%p\n", &a);
//	printf("静态区: % p\n", &b);
//	printf("堆区:%p\n", c);
//	printf("代码段/常量区:%p\n", d);
//	printf("普通函数:%p\n", func1);
//	printf("虚函数:%p\n", &Base1::func);
//	printf("虚函数表:%p\n", *((int*)&e));
//
//	return 0;
//}
class Base {
public:
    inline virtual void func1() 
	{ 
		cout << "Base::func1" << endl; 
	}
    virtual void func2() { cout << "Base::func2" << endl; }
private:
	int a;
};
class Derive :public Base {
public:
	void func1() { cout << "Derive::func1" << endl; }
	virtual void func3() { cout << "Derive::func3" << endl; }
	virtual void func4() { cout << "Derive::func4" << endl; }
private:
	int b;
};
//typedef void(*VFUNC)();
////void PRINTFVF(VFUNC a[])
//void PRINTFVF(VFUNC*a)
//{
//	for (int i = 0; a[i] != 0; i++)
//	{
//		printf("[%d]:[%p]\n", i, a[i]);
//		VFUNC f = a[i];
//		f();
//	}
//}
//inline void print()
//{
//	int i = 0;
//	cout << "1" << endl;
//}
int main()
{
	//print();
	Base b;
	Base* d = new Derive;
	b.func1();
	d->func1();
	/*Derive d;
	PRINTFVF((VFUNC*)(*(int*)&d));
	printf("\n");
	PRINTFVF((VFUNC*)(*(int*)&b));*/
	//b.func1();
	return 0;
}
//class Base1 {
//public:
//	virtual void func1() { cout << "Base1::func1" << endl; }
//	virtual void func2() { cout << "Base1::func2" << endl; }
//private:
//	int b1;
//};
//class Base2 {
//public:
//	virtual void func1() { cout << "Base2::func1" << endl; }
//	virtual void func2() { cout << "Base2::func2" << endl; }
//private:
//	int b2;
//};
//class Derive : public Base1, public Base2 {
//public:
//	virtual void func1() { cout << "Derive::func1" << endl; }
//	virtual void func3() { cout << "Derive::func3" << endl; }
//private:
//	int d1;
//};
//typedef void(*VFPTR) ();
//void PrintVTable(VFPTR vTable[])
//{
//	cout << " 虚表地址>" << vTable << endl;
//	for (int i = 0; vTable[i] != nullptr; ++i)
//	{
//		printf(" 第%d个虚函数地址 :0X%x,->", i, vTable[i]);
//		VFPTR f = vTable[i];
//		f();
//	}
//	cout << endl;
//}
//int main()
//{
//	Base1 b;
//	VFPTR* vTableb3 = (VFPTR*)(*(int*)&b);
//	PrintVTable(vTableb3);
//
//	Derive d;
//	VFPTR* vTableb1 = (VFPTR*)(*(int*)&d);
//	PrintVTable(vTableb1);
//	VFPTR* vTableb2 = (VFPTR*)(*(int*)((char*)&d + sizeof(Base1)));
//	PrintVTable(vTableb2);
//	return 0;
//}
//class person
//{
//public:
//	virtual void Buyticket()
//	{
//		cout << "成人票:全价" << endl;
//	}
//};
//class child :public person
//{
//public:
//	virtual void Buyticket()
//	{
//		cout << "儿童票:半价" << endl;
//	}
//};
//
//void func(person& p)
//{
//	p.Buyticket();
//}
//int main()
//{
//	person p;
//	func(p);
//
//	child c;
//	func(c);
//}
